package com.raymond.entity.commons;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.List;

import static org.springframework.beans.support.PagedListHolder.DEFAULT_PAGE_SIZE;

/**
 * desc-通用分页结果对象
 *
 * @author houmenghe
 * @date 2025/4/20 23:32
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class PageResponse<T> implements Serializable {

    /**
     * 第几页
     */
    private int pageNo;
    /**
     * 总记录数
     */
    private int total;
    /**
     * 当前页大小
     */
    private int pageSize = 1;
    /**
     * 总页数
     */
    private int totalPage;
    /**
     * 数据集
     */
    private List<T> datas;
    /**
     * 当前页汇总金额
     */
    private T currentPageTotalInfo;
    /**
     * 总金额
     */
    private T allPageTotalInfo;

    public PageResponse(int pageNo, int pageSize) {
        this.pageNo = pageNo;
        this.pageSize = pageSize;
    }

    /**
     * 设置总条数
     *
     * @param total 总条数
     */
    public void setTotal(int total) {
        this.total = total;
        this.totalPage = (total % pageSize == 0) ? total / pageSize : total / pageSize + 1;
    }

    /**
     * 设置分页大小 当前页
     *
     * @param pageRequest 分页基本类型
     */
    public void setPageBase(PageRequest pageRequest) {
        this.setPageSize(pageRequest.getPageSize());
        this.setPageNo(pageRequest.getPageNo());
    }

    /**
     * 创建分页实体
     *
     * @param datas    分页数据集合
     * @param total    总条数
     * @param pageSize 分页大小
     * @param pageNo   当前页
     * @param <T>      数据泛型
     * @return 分页实体
     */
    public static <T> PageResponse<T> create(List<T> datas, int total, int pageSize, int pageNo) {
        PageResponse<T> pageResponse = new PageResponse<>();
        pageResponse.setPageNo(pageNo);
        pageResponse.setPageSize(pageSize);
        pageResponse.setDatas(datas);
        pageResponse.setTotal(total);
        return pageResponse;
    }

    /**
     * 创建分页实体
     *
     * @param datas    分页数据集合
     * @param pageSize 分页大小
     * @param pageNo   当前页
     * @param <T>      数据泛型
     * @return 分页实体
     */
    public static <T> PageResponse<T> create(List<T> datas, int pageSize, int pageNo) {
        return create(datas, 0, pageSize, pageNo);
    }

    /**
     * 创建分页实体
     *
     * @param datas       分页数据集合
     * @param pageRequest 分页参数
     * @param <T>         数据泛型
     * @return 分页实体
     */
    public static <T> PageResponse<T> create(List<T> datas, PageRequest pageRequest) {
        return create(datas, 0, pageRequest);
    }

    /**
     * 创建分页实体
     *
     * @param datas       分页数据集合
     * @param pageRequest 分页参数
     * @param total       总条数
     * @param <T>         数据泛型
     * @return 分页实体
     */
    public static <T> PageResponse<T> create(List<T> datas, int total, PageRequest pageRequest) {
        return create(datas, total, pageRequest.getPageSize(), pageRequest.getPageNo());
    }

    /**
     * 创建分页实体
     *
     * @param pageRequest 分页参数
     * @param <T>         数据泛型
     * @return 分页实体
     */
    public static <T> PageResponse<T> create(PageRequest pageRequest) {
        return create(null, 0, pageRequest.getPageSize() == null ? DEFAULT_PAGE_SIZE : pageRequest.getPageSize(), pageRequest.getPageNo());
    }

}
